#include <cstdio>
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

#include "left_turn_predicate.h"

size_t n, m;
std::vector<point> polygon;  

int main() 
{
	
  //freopen("input.txt","r",stdin);
  //freopen("output.txt","w",stdout);

	std::cin >> n;
  polygon = std::vector<point>(n);
	
	size_t min_id = 0;
	for (size_t i = 0; i < n; ++i) 
	{
		std::cin >> polygon[i].x >> polygon[i].y;
		if (polygon[i] < polygon[min_id])
			min_id = i;
	}
	
	std::rotate(polygon.begin(), polygon.begin() +  min_id, polygon.end());
	
	size_t max_id = 0;
	for (size_t i = 0; i < polygon.size(); i++)
		if (polygon[max_id] < polygon[i])
			max_id = i;
	
	polygon.push_back(polygon[0]);
	//std::vector<point> rev_polygon = polygon;
	//std::reverse(rev_polygon.begin(), rev_polygon.end());

	std::cin >> m;
	for (size_t i = 0; i < m; ++i) 
	{             
        point p;
        std::cin >> p.x >> p.y;
		if (p < polygon[0] || polygon[max_id] < p)
		{
			std::cout << "NO\n";
			continue;
		}
		size_t l = 0, r = max_id;
		while (l + 1 < r)
		{
			size_t mid = (l + r)>>1;
			if (polygon[mid] < p) l = mid;
			else r = mid;
		}
		size_t down = l;
		l = max_id; r = n + 1;
		while (l + 1 < r)
		{
			size_t mid = (l + r)>>1;
			if (p < polygon[mid]) l = mid;
			else r = mid;
		}
		size_t up = l;
		//size_t down = std::lower_bound(polygon.begin(), polygon.begin() + (max_id - 1), p) - polygon.begin();
		//size_t up = std::lower_bound(rev_polygon.begin(), rev_polygon.begin() + (n + 1 - max_id), p) - rev_polygon.begin();
		if (left_turn_predicate(polygon[up], polygon[up + 1], p) >= 0 &&
			left_turn_predicate(polygon[down], polygon[down + 1], p) >= 0)
			std::cout << "YES\n";
		else
			std::cout << "NO\n";
	}
	return 0;
}